package com.vst.orm.util;



import java.lang.reflect.Field;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import net.sf.json.util.PropertyFilter;

/**
 * 忽略属性:
 * 忽略JAVABEAN的指定属性、是否忽略集合类属性
 * @author 江荣盛
 * 2012-7-10上午11:30:21
 */
public class IgnoreFieldProcessorImpl implements PropertyFilter{
	   
    /** 
     * 忽略的属性名称 
     */  
    private String[] fields;  
   
    /** 
     * 是否忽略集合 
     */  
    private boolean ignoreColl = false;  
    
    /** 
     * 格式时间 
     */  
    private Map dateFormat; 
   
    /** 
     * 空参构造方法<br/> 
     * 默认不忽略集合 
     */  
    public IgnoreFieldProcessorImpl() {  
        // empty  
    }  
   
    /** 
     * 构造方法 
     * @param fields 忽略属性名称数组 
     */  
    public IgnoreFieldProcessorImpl(String[] fields) {  
        this.fields = fields;   
    }  
   
    /** 
     * 构造方法 
     * @param ignoreColl    是否忽略集合 
     * @param fields    忽略属性名称数组 
     */  
    public IgnoreFieldProcessorImpl(boolean ignoreColl, String[] fields) {  
        this.fields = fields;  
        this.ignoreColl = ignoreColl;   
    }  
   
    /** 
     * 构造方法 
     * @param ignoreColl 是否忽略集合 
     */  
    public IgnoreFieldProcessorImpl(boolean ignoreColl) {  
        this.ignoreColl = ignoreColl;   
    }  
    
    /**
     * 构造方法 
     * @param ignoreColl 	是否忽略集合 
     * @param fields	忽略属性名称数组  
     * @param map	对时间类型格式化map中的key对应字段名称，value对应时间格式
     */
    public IgnoreFieldProcessorImpl(boolean ignoreColl, String[] fields, Map dateFormat) {  
        this.fields = fields;  
        this.ignoreColl = ignoreColl;
        this.dateFormat = dateFormat;
    }
    
    public boolean apply(Object source, String name, Object value) {  
        Field declaredField = null;  
        //忽略值为null的属性  
        if(value == null)  
            return true;  
//        // 时间类型格式化
//        if(value instanceof Date){
//        	String format = "yyyy-MM-dd";
//        	if(dateFormat != null && !dateFormat.isEmpty())
//        	{
//        		format = dateFormat.get(name) != null ? dateFormat.get(name).toString() : format;
//        		
//			}
//        	value = DateUtil.dateToString((Date)value, format);
//        	return true;
//		}   
        //剔除自定义属性，获取属性声明类型  
        //if(!"rows".equals(name) && "rows"!=name && !"pageSize".equals(name) && "pageSize"!=name ){  
            try {  
                declaredField = source.getClass().getDeclaredField(name);  
            } catch (NoSuchFieldException e) {  
                e.printStackTrace();  
            }  
        //}  
        // 忽略集合  
        if (declaredField != null) {  
            if(ignoreColl) {  
                if(declaredField.getType() == Collection.class  
                        || declaredField.getType() == Set.class
                        	|| declaredField.getType() == List.class) {  
                    return true;  
                }  
            }  
        }  
        // 忽略设定的属性  
        if(fields != null && fields.length > 0) {  
            if(juge(fields,name)) {    
                return true;    
            } else {    
                return false;    
            }   
        }  
        return false;  
    }  
    /** 
     * 过滤忽略的属性 
     * @param s 
     * @param s2 
     * @return 
     */  
    public boolean juge(String[] s,String s2){    
         boolean b = false;    
         for(String sl : s){    
             if(s2.equals(sl)){    
                 b=true;    
             }    
         }    
         return b;    
     }    
    public String[] getFields() {  
        return fields;  
    }  
   
    /** 
     * 设置忽略的属性 
     * @param fields 
     */  
    public void setFields(String[] fields) {  
        this.fields = fields;  
    }  
   
    public boolean isIgnoreColl() {  
        return ignoreColl;  
    }  
   
    /** 
     * 设置是否忽略集合类 
     * @param ignoreColl 
     */  
    public void setIgnoreColl(boolean ignoreColl) {  
        this.ignoreColl = ignoreColl;  
    }

	public Map getDateFormat() {
		return dateFormat;
	}
	
	/** 
     * 设置时间字段转换格式 
     * @param fields 
     */  
	public void setDateFormat(Map dateFormat) {
		this.dateFormat = dateFormat;
	}  
    
}
